package com.merry.aop.joinpoint;

import org.aopalliance.intercept.MethodInvocation;

import org.springframework.aop.framework.ReflectiveMethodInvocation;
import org.springframework.lang.Nullable;

/**
 * 该接口是 AOP 规范中 {@link MethodInvocation} 接口的扩展，
 * AOP Alliance MethodInvocation接口的扩展，允许访问方法调用所通过的代理。
 * 如果需要，例如调用目标返回自身，可以用代理替换返回值，这很有用。
 * 可以看他的一个重要的实现类。{@link ReflectiveMethodInvocation}。
 *
 */
public interface ProxyMethodInvocation extends MethodInvocation {

    /**
     * 返回这个方法连接点的代理对象。
     */
    Object getProxy();

    /**
     * 创建一个方法连接点，通过克隆的方式。
     */
    MethodInvocation invocableClone();

    MethodInvocation invocableClone(Object... arguments);

    /**
     * 设置此链中任何建议中后续调用时使用的参数。
     */
    void setArguments(Object... arguments);

    /**
     * 将具有给定值的指定用户属性添加到此调用中。
     * AOP框架本身不使用这些属性。它们只是作为调用对象的一部分保存，用于特殊的拦截器。
     */
    void setUserAttribute(String key, @Nullable Object value);

    /**
     * 返回指定用户属性的值。
     */
    @Nullable
    Object getUserAttribute(String key);

}
